package com.hqyj.websocket;


import com.hqyj.pojo.WebSocketInfo;
import com.hqyj.utile.JsonFormatUtil;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @Description
 * @Autor 伍军
 * @Date 2022/9/26 15:26
 * @Version 1.0
 **/
@Component
@ServerEndpoint(value = "/kickWs")//地址： 只能前端定义websocoket对象访问，浏览器不能直接访问
public class KickWebSocket {

    //记录所有会话
    private static List<Session>  list = new LinkedList<>();

    //记录用户的会话ID和用户名
    private static List<Map<String,Object>>  listMap = new LinkedList<>();
    //创建一个客户端触发的事件
    //session 会话，一个客户端对应一个session
    @OnOpen
    public void onOpen(Session s){
        System.out.println(s.getId()+"已经上线了");
        list.add(s);

    }

    //关闭一个客户端触发的事件
    @OnClose
    public void onClose(Session s){
        System.out.println(s.getId()+"已经下线了");
        //删除会话
        list.remove(s);
        //删除listMap记录的用户信息
        for(Map<String,Object> m:listMap){
            if(m.get("id").equals(s.getId())){
                //删除
                listMap.remove(m);
            }
        }
    }

    //接收客户端发送的消息
    @OnMessage
    public void onMessage(Session s,String msg) throws IOException {
        System.out.println("客户端"+s.getId()+"发送的消息是:"+msg);

        //查找用户是否已经登录过了
        if(listMap.size()>0){
            for(Map<String,Object> m:listMap){
                //查找已经登录过用户的用户名
                if(m.get("name").equals(msg)){
                   //查询这个用户对应的session会话
                    for(Session ss:list){
                        if(ss.getId().equals(m.get("id"))){
                            //判断是否在线
                            if(ss.isOpen()){
                                //发送消息给他，踢他下线
                                ss.getBasicRemote().sendText("已登录");
                            }

                        }
                    }
                }
            }
        }
        /*------添加登录用户的信息-----*/
        Map<String,Object> map = new HashMap<String,Object>();
        //记录id
        map.put("id",s.getId());
        //记录用户名
        map.put("name",msg);
        listMap.add(map);

    }

    //异常触发的事件
    @OnError
    public void onError(Session s,Throwable  t){
        System.out.println("客户端"+s.getId()+"出现异常："+t.getMessage());
    }


}
